RESTful APIのError Response
error message
のデザイン
#WIP
https://zenn.dev/ryamakuchi/articles/d7c932afc57e30
エラーをレスポンスに含める方法
headerに含める
bodyに含める
エンベロープの言及はあったが、実際に様々なサービスではbodyに含められていることが多い
こういうフォーマット良さそう
code:error
error: {
developperMessage: string; // 開発者向けのエラーメッセージ
userMessage: string; // ユーザー向けのエラーメッセージ
code: number // 400,404とか
info: string // 参考リンクなど
}
messsageよりもkindのようなもののほうがいい気もする
両方でもいい
clientによってエラーメッセージを変更したいというのはありうる
その分岐がしやすければ良い
以下の2種類がある
project全体で共通のerror message
API固有のerror message
これらの両方を扱えるように設計しないといけない
例えば、axiosをwrapしている関数postがあるなら、
post<返り値の型, API固有のErrorの型>のようなinterfaceにしておく必要がある
また、この2つのエラーはある程度interfaceが揃っている必要がある
messsageとかは必須で
ただ、このinterfaceのルールは業務で扱っているプロダクトの多岐に影響するので、最低限のものにしたい
5個も規定があると修正できない
型レベルで、どれが来たのか判定できるようにしたい
status codeレベルの粗さで十分なのか?という疑問はある
clientで、status code以上に細分したくなった場合、この4つのfieldだけでは不十分だと思う
code:error
error: {
developperMessage: string; // 開発者向けのエラーメッセージ
userMessage: string; // ユーザー向けのエラーメッセージ
code: number // 400,404とか
info: string // 参考リンクなど
}
developperMessageを正規表現判定すれば細分できるが、最悪だろう
400 Bad Requestとか粗いし
400番台
clientに問題がある
どのように対応するかはclientの責任
そのため、error messageは親切であるほうが好ましい
500番台
server側に問題がある
clientは何の対応もできない
そのため、error messageは詳細にすべきでない
詳細にしたところで、clientは何もできないし
詳細にすると、セキュリティ上のリスクもある
返り値に、statusを含めるのは冗長か?
status codeはheaderから受け取れる
しかし、こっちで見ると型が弱くなる
「値を見る前にstatus codeを確認せよ」は運用カバーになる
強制できない
こういうinterfacceにしておけば運用カバーではなく強制にできる
code:ts
type Result<R, E> =
| { status: 'ok', value: R }
| { status: 'error', message: E}
APIのresponseのvalueには、isSuccessとかは含めないほうがいいmrsekut.icon
普通にstatus codeでやり取りすべき
世の中のものがそうなっているのでそれに合わせたらいい
isSuccessとかはが必要なら、clientでそういう関数を噛ませるべき
https://www.eisbahn.jp/yoichiro/2017/01/rfc_7807.html
『現場で役立つシステム設計の原則』 p.238~
https://qiita.com/suin/items/f7ac4de914e9f3f35884
いろいろなサービスのレスポンス比較
https://www.baeldung.com/rest-api-error-handling-best-practices
https://tech.pepabo.com/2021/03/15/rails-api-error-response/
https://qiita.com/NagaokaKenichi/items/20825ae9256d9f4c6f35
https://qiita.com/Yametaro/items/39521d2a95a3b2987052
https://zenn.dev/nakaryo/articles/87b15866d67efe#エラーの設計
配列にしておくと、複数のエラーを表現できる